<?php

namespace App\Service\CommodityService;

use App\Service\BaseService;

class SupplierCommodityPriceService extends BaseService {

    const PRICE_MODE_SUB = 'priceSub';//截位，第二位小数
    const PRICE_MODE_CEIL = 'priceCeil';//向上取整，第三位小数
    const PRICE_MODE_ROUND = 'priceRound';//四舍五入，第三位小数

    /**
     * 计算高消费预警价格
     * 计算单价  假如单价 大于等于 高消费税预警金额 时 其税率就改为 高消费税率
     * @param array $param
     * @param int $tpye 小数点精度类型
     * 1.小数点两位 第3位四舍五入
     * 2.向上取整 无论第三位小数多大 都向上取整
     * 3.小数点两位 第三位直接截取
     * @param array $param
     * @param string $priceMode
     * @param int $digital
     * @author: hj
     */
    public function handleHightRatePrice(array $param, string $priceMode = self::PRICE_MODE_CEIL, int $digital = 2) {
        $price              = (string)$param['price'];//商品单价
        $specNum            = (string)$param['goodsSpecNum'];//商品单价
        $conSumptionTaxRate = $param['conSumptionTaxRate'];//高消费税率
        $conSumptionPrice   = $param['conSumptionPrice'];//消费税预警金额
        $tax_rate           = (string)$param['tax_rate'];//商品税率
        $has_rate           = $param['has_rate'];//是否含税

        //商品单价默认都是含税 要把不含税的价格算出来
        $percent      = bcadd('1', $tax_rate, 4);
        $notTaxPrice  = bcdiv($price, $percent, 3);
        $notTaxPrice2 = bcmul($notTaxPrice, '100', 2);
        $notTaxPrice3 = ceil($notTaxPrice2);
        $price        = bcdiv((string)$notTaxPrice3, '100', 2);

        $calculatePrice = $this->{$priceMode}($price, $specNum, $digital);
        $is_hight_rate  = 0; //是否属于高税价格商品(0-不是，1-是)
        $warnningPrice  = 0.00; //高税预警单价金额
        $lower_rate     = 0;//低税（仅is_high_rate=1的时候才会记录低税）
        //比较两个价格是否高税 （1- 左边大于右边，0-左右两边相等，-1 左边小于右边），第二个参数控制精度
        if ($conSumptionTaxRate > 0 && $conSumptionPrice > 0 && (bccomp((string)$calculatePrice, (string)$conSumptionPrice, 2) == 1)) {
            $is_hight_rate = 1;
            $lower_rate    = $tax_rate;
            $tax_rate      = $conSumptionTaxRate;
            $warnningPrice = $conSumptionPrice;
        }
        return [
            'is_hight_rate' => $is_hight_rate,
            'warnningPrice' => $warnningPrice,
            'lower_rate'    => $lower_rate,
            'tax_rate'      => $tax_rate,
        ];
    }

    /**
     * 截位
     * @param float|string $price
     * @param int|string $specNum
     * @param int $digital
     * @return string
     */
    public function priceSub($price, $specNum, int $digital) {
        return bcdiv((string)$price, (string)$specNum, $digital);
    }

    /**
     * 保留精度，第三位四舍五入
     * @param float|string $price
     * @param int|string $specNum
     * @param int $digital
     * @return false|float
     */
    public function priceRound($price, $specNum, int $digital) {
        $singlePrice = bcdiv((string)$price, (string)$specNum, $digital + 1);
        return round((float)$singlePrice, $digital);
    }

    /**
     * 保留精度，第三位向上取整
     * @param float|string $price
     * @param int|string $specNum
     * @param int $digital
     * @return string
     */
    public function priceCeil($price, $specNum, int $digital) {
        $singlePrice  = bcdiv((string)$price, (string)$specNum, $digital + 1);
        $singlePrice2 = bcmul($singlePrice, '100', $digital);
        $singlePrice3 = ceil($singlePrice2);
        return bcdiv((string)$singlePrice3, '100', $digital);
    }
}